{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 案例1: 给定一个二维数据集，使用kmeans进行聚类\n",
    "## 数据集：data/ex7data2.mat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy.io as sio\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['__header__', '__version__', '__globals__', 'X'])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data1 = sio.loadmat('./data/ex7data2.mat')\n",
    "data1.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300, 2)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = data1['X']\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0],X[:,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 获取每个样本所属的类别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def find_centroids(X,centros):\n",
    "    \n",
    "    idx = []\n",
    "    \n",
    "    for i in range(len(X)):\n",
    "        # (2,) (k,2) -> (k,2)\n",
    "        dist =np.linalg.norm((X[i] - centros),axis=1) #(k,)\n",
    "        id_i = np.argmin(dist)\n",
    "        idx.append(id_i)\n",
    "        \n",
    "    return np.array(idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 2, 1])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "centros = np.array([[3, 3], [6, 2], [8, 5]])\n",
    "idx = find_centroids(X,centros)\n",
    "idx[:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 计算聚类中心点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_centros(X,idx,k):\n",
    "    \n",
    "    centros = []\n",
    "    \n",
    "    for i in range(k):\n",
    "        centros_i = np.mean(X[idx == i],axis=0)\n",
    "        centros.append(centros_i)\n",
    "        \n",
    "    return np.array(centros)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2.42830111, 3.15792418],\n",
       "       [5.81350331, 2.63365645],\n",
       "       [7.11938687, 3.6166844 ]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "compute_centros(X,idx,k=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.运行kmeans，重复执行1和2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_kmeans(X,centros,iters):\n",
    "    \n",
    "    \n",
    "    k = len(centros)\n",
    "    centros_all = []\n",
    "    centros_all.append(centros)\n",
    "    centros_i = centros\n",
    "    for i in range(iters):\n",
    "        idx = find_centroids(X,centros_i)\n",
    "        centros_i = compute_centros(X,idx,k)\n",
    "        centros_all.append(centros_i)\n",
    "        \n",
    "    return idx,np.array(centros_all)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 绘制数据集和聚类中心的移动轨迹"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_data(X,centros_all,idx):\n",
    "    plt.figure()\n",
    "    plt.scatter(X[:,0],X[:,1],c=idx,cmap='rainbow')\n",
    "    plt.plot(centros_all[:,:,0],centros_all[:,:,1],'kx--')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "idx,centros_all = run_kmeans(X,centros,iters=10)\n",
    "plot_data(X,centros_all,idx)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 观察初始聚类点的位置对聚类效果的影响"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
